//类型注解
// function greeter(person:string) {
//     return "Hello, " + person;
// }
// 
// let user = "Jane User";
// 
// document.body.innerHTML = greeter(user);
//类
// class Student {
// 	fullName:string;
// 	//在构造函数上使用public等同于创建了同名的成员变量
// 	constructor(public firstName, public middleInitial, public lastName)
// }
//接口
// interface Person{
// 	firstName:string;
// 	lastName:string;
// }
// function greeter(person:Person){
// 	return "hello,"+person.firstName+" "+person.lastName;
// }
// let user = {firstName:'Jane',lastName:'User'};
//元组(tuple)类型 允许表示一个已知元素数量和类型的数组，各元素的类型不必相同
var x;
x = ['hello', 58];
//枚举类型 使用枚举数据类型可以为一组数据赋予友好的名字,so,便利之处就是由枚举的值得到他映射的名字
var Color;
(function (Color) {
    Color[Color["Red"] = 0] = "Red";
    Color[Color["Green"] = 1] = "Green";
    Color[Color["Blue"] = 2] = "Blue";
})(Color || (Color = {}));
var c = Color.Green;
var colorName = Color[2];
console.log(c, colorName);
//any 为在编程阶段还不清楚类型的变量制定一个类型,在对代码进行改写时，允许你在编译时可选择的包含或移除类型检查
//	  并不能使用Object类型代替他的作用
var notSure = 4;
notSure = '我是字符串';
notSure = true;
//void //与any类型相反，表示没有任何类型，只能赋予undefined或null,用法：
function warnUser() {
    console.log('...'); //函数没有返回值，指定其返回值类型为Void
}
console.log(warnUser());
//undefined,null,默认情况是所有类型的子类型，尽可能使用 -- strictNullChecks标记，这样，null,undefined只能赋予本身和void
//nerver 是那些永远不存在的值得类型，，常用在总是抛出异常或根本不会有返回值的函数表达式或箭头函数的返回值类型
function error(message) {
    throw new Error(message);
}
function infiniteLoop() {
    while (true) {
    }
}
//类型断言
//通过类型断言这种方式告诉编译器，能做到比现有类型，更精确的类型，
//像是其他语言的类型转换，但是不进行特殊的数据检查和解构，在编译阶段起作用
//尖括号表示法
var someValue = "this is a string";
var strLength = someValue.length;
//as语法
// let someString:any = 'this is a string';
// let strLength:number = (someString as string).length//使用JSX时，只有as语法被允许
//基础类型有 布尔值(boolean) 数字(number) 字符串(string) 数组 元组(tuple) 枚举(enum)
//数组有两种表示方法①  元素类型[]  ② Array<元素类型>  数组泛型
//元组允许表示一个已知元素数量和元素类型的数组 [string,number] 当访问越界元素时，会使用联合类型代替
//枚举数据类型可以为一组数值赋予友好的名字
